什么是低秩适配(LoRA)技术?如何结合 LoRA 技术进行微调?
LoRA(Low-Rank Adaptation,低秩适配) 是 PEFT(参数高效微调) 的主流做法:冻结预训练大模型权重,只训练旁路低秩矩阵,用少量数据与算力适配下游任务。本篇讲面试答法;与 RAG 分工见 RAG 与检索增强 微调边界一节。
LoRA 是什么
全量微调要更新模型全部参数(7B 即 70 亿),显存与存储成本高。LoRA 假设:任务相关的权重更新具有低秩结构——可用两个小矩阵的乘积近似。
对某线性层权重 W(维度 d×k),LoRA 不直接改 W,而是:
W' = W + ΔW = W + B · A
B ∈ R^{d×r},A ∈ R^{r×k},秩 r ≪ min(d, k)
前向时:
h = W·x + (α/r) · B·A·x
| 符号 | 含义 |
|---|---|
| W | 预训练权重,冻结 |
| A、B | 可训练低秩适配器,参数量约 r×(d+k) |
| r(rank) | 秩,常见 8~64;越大表达能力越强、参数越多 |
| α(lora_alpha) | 缩放系数,常设 α = 2r 或与 r 同量级 |
推理时 可将 BA 合并进 W(merge),对外仍是一个模型;或多 LoRA 适配器按任务 热切换(不 merge,加载 adapter)。
面试一句话:LoRA = 冻结底座 + 训练小矩阵 B、A,近似全量微调的 ΔW,省显存、可插拔。
为什么用 LoRA
| 对比 | 全量微调 | LoRA |
|---|---|---|
| 可训练参数 | 100% | 通常 0.1%~1% |
| 显存 | 高(存 optimizer 状态) | 低;配合 QLoRA 更低 |
| 存储 | 每任务一份完整模型 | 每任务一份 adapter(MB 级) |
| 多任务 | 多份大 checkpoint | 一底座 + 多 adapter |
| 灾难性遗忘 | 风险较高 | 底座不动,相对可控 |
LoRA 属于 PEFT 家族;面试常一起提 Adapter、Prefix Tuning、Prompt Tuning——LoRA 在 LLM 工程里最常见、生态最好(Hugging Face PEFT、LLaMA-Factory、Unsloth 等)。
与 RAG / Prompt 怎么分工
| 手段 | 更适合 |
|---|---|
| RAG | 知识常变、要可引用、要可撤回 |
| Prompt | 轻量格式约束、快速试验 |
| LoRA / SFT | 稳定风格、格式、领域话术、工具调用模式、分类路由 |
| RLHF / DPO | 偏好对齐、安全、减少有害输出 |
常见组合:知识走 RAG,行为走 LoRA;或 LoRA 学「怎么用好检索结果」的模板,事实仍靠检索。详见 RAG 与检索增强。
如何结合 LoRA 做微调(工程流程)
1. 选底座模型(开源权重 + 许可证)
2. 准备数据(instruction / chat JSONL,清洗与去重)
3. 定任务与验收(格式?分类?对话风格?)
4. 配 LoRA 超参 + 训练(SFT;可选 DPO)
5. 离线评测 vs 基座 / vs Prompt-only
6. 部署:merge 或 adapter 热加载;版本与回滚
1. 数据
| 类型 | 格式 | 用途 |
|---|---|---|
| SFT | instruction / input / output 字段或 ShareGPT 多轮 | 教格式、话术、任务 |
| 偏好 | chosen / rejected 对 | DPO / RLHF 对齐 |
| Agent | 轨迹(tool call 序列) | 学工具调用模式 |
质量 > 数量:几百条高质量往往胜过万条噪声;与 [AI 应用测试与效果评估](/docs/ai/Agent/面试/AI 应用测试与效果评估) 共用评测集思路。
2. 挂哪些层(target_modules)
常见只对 Attention 的 q/v(有时 k/o) 或 MLP 的 linear 加 LoRA:
# Hugging Face PEFT 示意
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"], # 模型架构不同名字不同
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(base_model, config)
# 仅 LoRA 参数 requires_grad=True
| 选择 | 说明 |
|---|---|
| 只 q/v | 参数更少,很多任务够用 |
| q/k/v/o + MLP | 表达能力更强,显存升 |
| 全 linear | 接近「大力出奇迹」,慎用 |
3. 关键超参
| 超参 | 直觉 |
|---|---|
| r | 8~16 起步;任务复杂可 32~64 |
| lora_alpha | 常 2r;与 r 一起决定 adapter 缩放 |
| learning rate | 比全量微调大一个量级常见(如 1e-4~2e-4) |
| epochs / steps | 小数据防过拟合,早停 |
| batch + 累积 | 受显存限制;QLoRA 用 4bit 底座 |
4. QLoRA(面试常追问)
QLoRA = 4bit 量化底座 + LoRA 训练 adapter:
- 底座以 NF4 等格式加载,显存大幅下降
- 只训练 LoRA 权重为 fp16/bf16
- 适合单卡微调 7B~70B 的消费级场景
5. 训练栈(点到为止)
| 工具 | 说明 |
|---|---|
| Hugging Face PEFT + TRL | 标准组合 |
| LLaMA-Factory / Axolotl | 配置化 SFT/LoRA |
| Unsloth | 加速 LoRA 训练 |
不必背 API;面试说清 PEFT 包一层、只优化 adapter 即可。
6. 推理部署
| 方式 | 说明 |
|---|---|
| Adapter 热加载 | 一底座 + load_adapter("customer-a") 切换 |
| Merge 权重 | merge_and_unload() 导出单文件,部署简单 |
| 多 LoRA 批处理 | vLLM / S-LoRA 等 serving 优化 |
版本管理:adapter 与底座版本、训练数据 hash 一起记录,便于回滚。
常见坑
| 坑 | 说明 |
|---|---|
| 用 LoRA 灌知识 | 事实常变应 RAG;LoRA 易过拟合、难更新 |
| r 过大 + 数据少 | 过拟合、泛化差 |
| 不评测基线 | 应先比 Prompt-only / RAG-only |
| target_modules 写错 | 训练跑通但 adapter 未挂到层上 |
| 忽略许可证 | 底座与商用限制 |
面试参考答法(60~90 秒)
LoRA 是低秩适配:冻结预训练权重 W,只训练 B、A 使 ΔW≈BA,前向是 Wx 加缩放后的 BAx。秩 r 远小于原矩阵维度,可训练参数通常不到 1%,显存和存储都省,一个底座可挂多个 adapter。
结合微调时,我先定任务——风格、格式、工具调用模式适合 LoRA;易变知识用 RAG。数据用 instruction 或对话 JSONL,清洗后 SFT;用 PEFT 指定 target_modules 如 q_proj/v_proj,设 r、alpha、学习率。显存紧用 QLoRA 4bit 底座。训完用 held-out 集对比基座,再决定 merge 还是 adapter 部署。
和 RAG 是叠加关系:RAG 供事实,LoRA 学怎么用、怎么答。
延伸阅读
| 篇 | 关系 |
|---|---|
| RAG 与检索增强 | RAG vs 微调边界 |
| RAG 与框架选型 | 何时上 RAG 而非训模型 |
| [AI 应用测试与效果评估](/docs/ai/Agent/面试/AI 应用测试与效果评估) | 微调效果评测 |
面试速记
- LoRA 是什么: ΔW=BA 低秩近似;冻结 W,只训 B、A;推理可 merge。
- 为何用: 参数/显存省、多任务多 adapter、PEFT 主流方案。
- 流程: 数据 → SFT → PEFT 挂层 → 训 → 评测 → merge 或热加载。
- 关键超参: r、alpha、target_modules、lr;显存紧用 QLoRA。
- 与 RAG: 知识用 RAG,行为/格式用 LoRA;别用 LoRA 替代知识库。